home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d1
/
eddtv4.arc
/
EDDTV400.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-03-28
|
39KB
|
936 lines
.XLIST
PAGE 80,120
PAGE
TITLE OèÄ EDDT - EXTENDED DRIVE DESCRIPTON TABLESö
.LIST
.286 ; ENABLE 80286 INSTRUCTIONS
SUBTTL ROUTINE TO ALLOW EXTENDED HARD DRIVE DESCRIPTIONS
COMMENT *
EDDT VERSION 4.00
Copyright 1987,1988 Don Gentry
A limited license is granted to all users of this program,
to make copies of this program, and distribute them to
other users, on the following conditions:
1. The notice on this page is not to be removed or altered
2. No fee is to be charged for copying or distributing
the program.
3. No warranty of any kind is offered. This program is offered
on an "AS IS" basis. Each user should verify that it meets
his needs and verify correct operation.
4. No further restrictions on redristribution of any kind may
be required. This includes, but is not limited to,
COMPUSERVE or other program distribution services,
by electronic or other means.
FOR HELP OR SUGGESTIONS WRITE:
DON GENTRY
183 BELLEGROVE CIRCLE
BRANDON, MS 39042
OR CALL (601) 992-0577
*
IF1
PAGE
INCLUDE EDDT_MAC.LIB
ENDIF
PAGE
PAUSE MACRO ; 03/12/88
;; NO PAUSE TIME IN EDDT VERSION 4.00 03/12/88
ENDM 03/12/88
PAGE_0 SEGMENT AT 0 ; DEFINE LOW MEMORY
ORG 041H*4 ; SKIP TO DRIVE 0 VECTOR
ED_DRIV0 DD ? ; DRIVE 0 PARAMETER VECTOR
ORG ED_DRIV0 ; REDEFINE VECTOR
ED_D0OFF DW ? ; DRIVE 0 VECTOR OFFSET
ED_D0SEG DW ? ; DRIVE 0 VECTOR SEGMENT
ORG 046H*4 ; SKIP TO DRIVE 0 VECTOR
ED_DRIV1 DD ? ; DRIVE 1 PARAMETER VECTOR
ORG ED_DRIV1 ; REDEFINE VECTOR
ED_D1OFF DW ? ; DRIVE 1 VECTOR OFFSET
ED_D1SEG DW ? ; DRIVE 1 VECTOR SEGMENT
ORG 078H*4 ; ORG TO UNUSED RUPT VECTOR
ED_WORKA DB 4 DUP(?) ; WORK AREA
PAGE_0 ENDS ; END OF SEGMENT
PAGE
;-----------------------------------------------------------------------
; ROM BIOS DATA AREAS
;-----------------------------------------------------------------------
DATA SEGMENT AT 40H
RS232_BASE DW 4 DUP(?) ; ADDRESSES OF RS232 ADAPTERS
PRINTER_BASE DW 4 DUP(?) ; ADDRESSES OF PRINTERS
EQUIP_FLAG DW ? ; INSTALLED HARDWARE
MFG_TST DB ? ; INITIALIZATION FLAG
MEMORY_SIZE DW ? ; MEMORY SIZE IN K BYTES
MFG_ERR_FLAG DB ? ; SCRATCH PAD FOR MANUFACTURING
DB ? ; ERROR CODES
;-----------------------------------------------------------------------
; KEYBOARD DATA AREAS
;-----------------------------------------------------------------------
KB_FLAG DB ? ; KEYBOARD STATUS
KB_FLAG_1 DB ? ; SECOND BYTE OF KEYBOARD STATUS
ALT_INPUT DB ? ; STORAGE FOR ALTERNATE KEYPAD ENTRY
;
; ----- SHIFT FLAG EQUATES WITHIN KB_FLAG
;
INS_STATE EQU 80H ; INSERT SATE IS ACTIVE
CAPS_STATE EQU 40H ; CAPS LOCK STATE HAS BEEN TOGGLED
NUM_STATE EQU 20H ; NUM LOCK STATE HAS BEEN TOGGLED
SCROLL_STATE EQU 10H ; SCROLL LOCK STATE HAS BEEN TOGGLED
ALT_SHIFT EQU 08H ; ALTERNATE SHIFT KEY DEPRESSED
CTL_SHIFT EQU 04H ; CONTROL SHIFT KEY DEPRESSED
LEFT_SHIFT EQU 02H ; LEFT SHIFT KEY DEPRESSED
RIGHT_SHIFT EQU 01H ; RIGHT SHIFT KEY DEPRESSED
ORG 001AH ; ORG TO KEYBOARD BUFFER
BUFFER_HEAD DW ? ; POINTER TO HEAD OF KEYBOARD BUFFER
BUFFER_TAIL DW ? ; POINTER TO TAIL OF KEYBOARD BUFFER
KB_BUFFER DW 16 DUP(?) ; ROOM FOR 15 ENTRIES
ORG 0049H ; ORG TO START OF DISPLAY DATA
;-----------------------------------------------------------------------
; VIDEO DISPLAY DATA AREA
;-----------------------------------------------------------------------
CRT_MODE DB ? ; CURRENT CRT MODE
CRT_COLS DW ? ; NUMBER OF COLS ON SCREEN
CRT_LEN DW ? ; LENGTH OF REGEN IN BYTES
CRT_START DW ? ; STARTING ADDRESS IN REGEN BUFFER
CURSOR_POSN DW 8 DUP(?) ; CURSOR FOR EACH OF UP TO 8 PAGES
CURSOR_MODE DW ? ; CURRENT CURSOR MODE SETTING
ACTIVE_PAGE DB ? ; CURRENT PAGE BEING DISPLAYED
ADDR_6845 DW ? ; BASE ADDRESS FOR ACTIVE DISPLAY CARD
CRT_MODE_SET DB ? ; CURRENT SETTING OF THE 3X8 REGISTER
CRT_PALETTE DB ? ; CURRENT PALETTE SETTING COLOR CARD
;-----------------------------------------------------------------------
; POST AND BIOS WORK DATA AREA
;-----------------------------------------------------------------------
IO_ROM_INIT DW ? ; PNTR TO OPTIONAL I/O ROM INIT ROUTINE
IO_ROM_SEG DW ? ; POINTER TO I/O ROM SEGMENT
INTR_FLAG DB ? ; FLAG TO INDICATE AN INTERRUPT HAPPENE
;-----------------------------------------------------------------------
; TIMER DATA AREA
;-----------------------------------------------------------------------
TIMER_LOW DW ? ; LOW WORD OF TIMER COUNT
TIMER_HIGH DW ? ; HIGH WORD OF TIMER COUNT
TIMER_OFL DB ? ; TIMER HAS ROLLED OVER SINCE READ
;-----------------------------------------------------------------------
; SYSTEM DATA AREA
;-----------------------------------------------------------------------
BIOS_BREAK DB ? ; BIT 7=1 IF BREAK KEY DEPRESSED
RESET_FLAG DW ? ; WORD=1234H IF KEYBOARD RESET
;-----------------------------------------------------------------------
; FIXED DISK DATA AREA
;-----------------------------------------------------------------------
DISK_STATUS1 DB ? ; FIXED DISK STATUS
HF_NUM DB ? ; COUNT OF FIXED DISKS
CONTROL_BYTE DB ? ; HEAD CONTROL BYTE
PORT_OFF DB ? ; RESERVED (PORT OFFSET)
;
ORG 0080H ; ORG TO START OF ADDITIONAL KB DATA
BUFFER_START DW ?
BUFFER_END DW ?
DATA ENDS
;
PAGE
ED_CODE SEGMENT PARA PUBLIC 'CODE' ; CODE SEGMENT
EDDT_ROM PROC FAR ; BEGINNING OF CODE SEGMENT
ASSUME CS:ED_CODE ; INFORM ASSEMBLER
DB 055H,0AAH ; ROM MARKER
DB 16 ; NUMBER OF 512 BYTE BLOCKS
ED_ENTRY: ; ENTRY POINT FOR EDDT
JMP ED_GO ; JUMP TO CODE START
DB 'EDDT Version 4.00'
DB 'Copyright 1987,1988 Don Gentry'
DB ' '
EVEN
DB 'CCooppyyrriigghhtt 11998877,,11998888'
DB ' DDoonn GGeennttrryy '
DB 'REVISION DATE 03/12/88'
ED_MSG0 EQU $
DFLD 02,32,15,'EDDT Version 4.00'
ED_MSG1 EQU $
DFLD 03,26,15,'Copyright 1987,1988 Don Gentry'
ED_MSG2 EQU $
DFLD 04,25,15,'Extended Drive Description Tables'
ED_NOEFD EQU $
DFLD 06,24,15,'EDDT_01 - No Fixed Drives defined'
ED_FD0E1 EQU $
DFLD 06,24,15,'EDDT_02 - Invalid type defined for drive 0'
ED_FD1E1 EQU $
DFLD 07,24,15,'EDDT_02 - Invalid type defined for drive 1'
ED_FD0E2 EQU $
DFLD 06,24,15,'EDDT_05 - Drive 0 failed diagnostics RC='
ED_FD1E2 EQU $
DFLD 07,24,15,'EDDT_05 - Drive 1 failed diagnostics RC='
ED_CME01 EQU $
DFLD 08,24,15,'EDDT_03 - CMOS ERROR bad checksum or battery'
ED_CTLRE EQU $
DFLD 06,24,15,'EDDT_04 - Controller failed internal tests' '
ED_DPRM1 EQU $
DFLD 10,30,07,'FIXED DRIVE PARAMETERS'
ED_DPRM2 EQU $
DFLD 12,44,07,'Drive 0 Drive 1'
ED_DPRM3 EQU $
DFLD 13,18,07,'Cylinders 0000D 0000D'
ED_DPRM4 EQU $
DFLD 14,18,07,'Heads 00D 00D'
ED_DPRM5 EQU $
DFLD 15,18,07,'Write Pre-Compensation 0000H 0000H'
ED_DPRM6 EQU $
DFLD 16,18,07,'Control Byte 00H 00H'
ED_DPRM7 EQU $
DFLD 17,18,07,'Landing Zone 0000D 0000D'
ED_DPRM8 EQU $
DFLD 18,18,07,'Sectors/Track 00D 00D'
ED_DPRM9 EQU $
DFLD 20,00,07
ED_DIAG0 EQU $
DFLD 20,14,07,'Performing Diagnostics on Drive _'
ED_DIAG1 EQU $
DFLD 22,14,07,'Function __ Status 00H'
ED_DIAG2 EQU $
DFLD 22,23,07,'09H Set Drive Parms Status 00H'
ED_DIAG3 EQU $
DFLD 22,23,07,'00H Drive Reset Status 00H'
ED_DIAG4 EQU $
DFLD 22,23,07,'10H Test Drive Ready Status 00H'
ED_DIAG5 EQU $
DFLD 22,23,07,'11H Recalibrate Status 00H '
ED_DIAG6 EQU $
DFLD 22,23,07,'04H Verify Track 0 Status 00H'
ED_DIAG7 EQU $
DFLD 22,23,07,'04H Verify Last Track Status 00H '
ED_DIAG8 EQU $
DFLD 22,57,07
ED_DIAG9 EQU $
DFLD 22,23,07,'08H Return Drive Parms Status 00H'
ED_PRESS EQU $
DFLD 23,28,15,'Press Any Key To Continue'
ED_PRESC EQU $
DFLD 23,28,15,' '
ED_CSR24 EQU $
DFLD 24,08,07
PAGE
;
; ----- EXTENDED DRIVE DESCRIPTOR TABLES
;
INCLUDE EDDTBL40.ASM ; COPY OUR DRIVE TABLE
PAGE
;
ED_CMOS EQU $ ; CMOS I/O AREA
ED_FDTYP DB 0 ; FLOPPY DISK DRIVES
DB 0 ; RESERVED
ED_HDTYP DB 0 ; DRIVE TYPES 1-14
DB 0 ; RESERVED
ED_EQ DB 0 ; EQUIPMENT BYTE
ED_MBML DB 0 ; MOTHER BOARD MEMORY LOW BYTE
ED_MBMH DB 0 ; MOTHER BOARD MEMORY HI BYTE
ED_EXML DB 0 ; EXPANSION MEMORY LOW BYTE
ED_EXMH DB 0 ; EXPANSION MEMORY HI BYTE
ED_HD0E DB 0 ; HARD DRIVE 0 EXTENDED TYPE
ED_HD1E DB 0 ; HARD DRIVE 1 EXTENDED TYPE
DB 19 DUP(0) ; RESERVED
ED_CHKSL DB 0 ; CHECKSUM BYTE LOW
ED_CHKSH DB 0 ; CHECKSUM BYTE HI
PAGE
; __________________________________________________________________
; : :
; : BEGIN THE LOGIC SECTION OF ETTDV300 :
; :__________________________________________________________________:
;
ED_GO: ; START OF LOGIC
;
; ----- SAVE DOS' REGISTERS TO STACK
;
PUSHF ; SAVE FLAGS
PUSH DS ; SAVE DS REGISTER
PUSH ES ; SAVE ES REGISTER
PUSHA ; SAVE REMAINING REGS
;
; ----- INITIALIZE OUR SEGMENT REGISTERS
;
MOV AX,00H ; MOV ZERO TO AX
MOV ES,AX ; ADDRESS PAGE 0 WITH ES
ASSUME ES:PAGE_0 ; INFORM ASSEMBLER
MOV AX,40H ; GET ADDRESS OF BIOS DATA SEGMENT
MOV DS,AX ; ADDRESS BIOS DATA SEGMENT WITH DS
ASSUME DS:DATA ; INFORM ASSEMBLER
CLD ; CLEAR DIRECTION FLAG
MOV HF_NUM,00H ; CLEAR NUMBER OF DRIVES
;
; ----- CLEAR THE SCREEN
;
MOV AH,05H ; SELECT ACTIVE VIDEO PAGE
MOV AL,00H ; SELECT PAGE 0
INT 10H ; VIDEO RUPT TO BIOS
;
CLS ; CLEAR THE SCREEN
;
; ----- WRITE THE COPYRIGHT MESSAGE
;
WCS ED_MSG0,,CS ; WRITE MESSAGE
WCS ED_MSG1,,CS ; WRITE MESSAGE
WCS ED_MSG2,,CS ; WRITE MESSAGE
ED_HDGO:
;
; ----- INITIALIZE DISK POINTER VECTORS
;
CLI ; RUPTS OFF
MOV ED_D0SEG,CS ; SEGMENT OF TABLE
MOV ED_D0OFF,OFFSET ED_TZERO ; DUMMY ENTRY
MOV ED_D1SEG,CS ; SEGMENT OF TABLE
MOV ED_D1OFF,OFFSET ED_TZERO ; DUMMY ENTRY
MOV PORT_OFF,00H ; ZERO CONTROLLER PORT ADDRESS
MOV DISK_STATUS1,00H ; CLEAR DRIVE STATUS BYTE
MOV CONTROL_BYTE,00H ; CLEAR THE CONTROL BYTE
;
STI ; RUPTS ON
CMOS READ,0EH ; READ CMOS DIAGNOSTIC BYTE
;
; CHECK THE CMOS DIAGNOSTIC STATUS BYTE FOR THE FOLLOWING
; 11000000
; ||
; |`-----------> CMOS CHECKSUM IS INVALID
; `--------------> CMOS BATTERY HAS FAILED
;
TEST AL,11000000B ; IS CMOS GOOD ?
JZ ED_CM01 ; ...YES - CONTINUE
WCS ED_CME01,,CS ; WRITE ERROR MESSAGE
;
JMP ED_EXIT
ED_CM01:
;
; SET THE CMOS DIAGNOSTIC STATUS BYTE FOR THE FOLLOWING
; 00000000
; |
; `----> 0 = DRIVE C WORKING - OK TO BOOT FROM C
;
AND AL,11110111B ; SET BOOT FROM C OK BIT OFF
MOV AH,AL ; SAVE THE DATA IN AL IN AH
CMOS WRITE,0EH,AH ; WRITE TO CMOS
PAGE
;
; ----- READ THE CMOS & CHECK FOR DRIVE 0
;
CMOS READ,019H ; READ EDDT FIXED DISK TYPE BYTE
;
CMP AL,00H ; EDDT TYPE DEFINED ?
JNE ED_FD001 ; ...YES - HANDLE DRIVE 0
WCS ED_NOEFD,,CS ; WRITE MESSAGE & EXIT
;
JMP ED_EXIT ; EXIT TO THE BIOS
;
; ----- SETUP DRIVE 0
;
ED_FD001:
CMP AL,ED_MAXE-1 ; IS TYPE > MAX ?
JNA ED_FD0OK ; ...NO - OK TO CONTINUE
ED_FD0ER:
WCS ED_FD0E1,,CS ; WRITE ERROR MESSAGE FOR DRIVE 0
JMP ED_FD100 ; GO TRY DRIVE 1
;
ED_FD0OK:
MOV AH,00H ; CLEAR AH
SUB AX,1 ; SUBTRACT BASE ENTRY NUMBER
SHL AX,4 ; AX * 10H (LENGTH OF AN ENTRY)
LEA DX,ED_TABLE ; GET BASE ADDRESS OF THE TABLE
ADD DX,AX ; GET SEGMENT OFFSET OF ENTRY
;
; ----- SETUP INTERRUPT 41 FOR DRIVE 0
;
CLI ; RUPTS OFF
MOV ED_D0OFF,DX ; SET THE OFFSET
MOV ED_D0SEG,CS ; SET THE SEGMENT
STI ; ENABLE RUPTS
INC HF_NUM ; ADD TO COUNT OF HARD DISKS
;
; ----- READ THE CMOS & CHECK FOR DRIVE 1
;
ED_FD100:
CMOS READ,01AH ; READ EDDT FIXED DISK TYPE BYTE
;
CMP AL,00H ; EDDT TYPE DEFINED ?
JNE ED_FD101 ; ...YES - HANDLE DRIVE 1
;
JMP ED_EXIT ; EXIT TO THE DIAGS
;
; ----- SETUP DRIVE 0
;
ED_FD101:
CMP AL,ED_MAXE-1 ; IS TYPE > MAX ?
JNA ED_FD1OK ; ...NO - OK TO CONTINUE
ED_FD1ER:
WCS ED_FD1E1,,CS ; WRITE ERROR MESSAGE FOR DRIVE 1
JMP ED_EXIT ; GO EXIT
;
ED_FD1OK:
MOV AH,00H ; CLEAR AH
SUB AX,1 ; SUBTRACT BASE ENTRY NUMBER
SHL AX,4 ; AX * 10H (LENGTH OF AN ENTRY)
LEA DX,ED_TABLE ; GET BASE ADDRESS OF THE TABLE
ADD DX,AX ; GET SEGMENT OFFSET OF ENTRY
;
; ----- SETUP INTERRUPT 46 FOR DRIVE 1
;
CLI ; RUPTS OFF
MOV ED_D1OFF,DX ; SET THE OFFSET
MOV ED_D1SEG,CS ; SET THE SEGMENT
STI ; ENABLE RUPTS
INC HF_NUM ; ADD TO COUNT OF HARD DISKS
PAGE
ED_EXIT:
CMP HF_NUM,0 ; ANY DRIVES FOUND ?
JNE ED_CDIAG ; ...YES - CONTROLLER DIAG
JMP ED_DONE ; ...NO - EXIT NOW
ED_CDIAG:
;
; ----- PRINT DRIVE 0/DRIVE 1 PARMS ON CRT
;
CALL ED_LDP ; CALL LIST DRIVE PARMS
CALL ED_KINIT ; INITIALIZE THE KEYBOARD
;
; ----- EXECUTE CONTROLLER DIAGS 8888888
;
MOV AH,14H ; DIAG FUNCTION
MOV DL,80H ; GIVE HIM A DRIVE NUMBER
INT 13H ; RUPT TO BIOS
JNC ED_CTLGD ; NO ERROR GO ON
WCS ED_CTLRE,,CS ; WRITE ERROR MESSAGE
ED_CTLGD:
WCS ED_DIAG0,,CS ; WRITE MESSAGE
WCS ED_DIAG1,,CS ; WRITE MESSAGE
MOV AH,02H ; SET CURSOR POSITION
MOV BH,00H ; SELECT PAGE
MOV DX,142EH ; CURSOR POSITION
INT 10H ; VIDEO RUPT TO BIOS
;
MOV AH,0AH ; WRITE CHARACTER
MOV BH,00H ; VIDEO PAGE
MOV CX,1 ; NUMBER OF CHARS
MOV AL,'0' ; CHARACTER TO WRITE
INT 10H ; VIDEO RUPT TO BIOS
;
MOV DL,80H ; GET DRIVE 0 ADDRESS
CALL ED_INITD ; INIT DRIVE 0
CMP HF_NUM,2 ; 2 DRIVES FOUND ?
JNE ED_1DRIV ; ...NO - SKIP DRIVE 2
MOV AH,02H ; SET CURSOR POSITION
MOV BH,00H ; SELECT PAGE
MOV DX,142EH ; CURSOR POSITION
INT 10H ; VIDEO RUPT TO BIOS
;
MOV AH,0AH ; WRITE CHARACTER
MOV BH,00H ; VIDEO PAGE
MOV CX,1 ; NUMBER OF CHARS
MOV AL,'1' ; CHARACTER TO WRITE
INT 10H ; VIDEO RUPT TO BIOS
;
MOV DL,81H ; GET DRIVE 1 ADDRESS
CALL ED_INITD ; INIT DRIVE 1
ED_1DRIV:
ED_DONE:
CSRP ED_CSR24 ; POSITION CURSOR ON EXIT
;
; ----- RESTORE DOS' REGISTERS FROM THE STACK
;
POPA ; GET REGS FROM STACK
POP ES ; RECOVER ES
POP DS ; RECOVER DS
POPF ; RECOVER FLAGS
;
; ----- RETURN TO DOS & CONTINUE INITIALIZATION
;
RET ; RETURN
PAGE
;
; ----- LIST THE DRIVE PARAMETERS ON THE SCREEN
;
ED_LDP PROC NEAR ; DEFINE PROCEDURE
;
WCS ED_DPRM1,,CS ; WRITE DISK PARM TABLE MESSAGE
;
WCS ED_DPRM2,,CS ; WRITE DISK PARM TABLE MESSAGE
;
WCS ED_DPRM3,,CS ; WRITE DISK PARM TABLE MESSAGE
;
WCS ED_DPRM4,,CS ; WRITE DISK PARM TABLE MESSAGE
;
WCS ED_DPRM5,,CS ; WRITE DISK PARM TABLE MESSAGE
;
WCS ED_DPRM6,,CS ; WRITE DISK PARM TABLE MESSAGE
;
WCS ED_DPRM7,,CS ; WRITE DISK PARM TABLE MESSAGE
;
WCS ED_DPRM8,,CS ; WRITE DISK PARM TABLE MESSAGE
;
CSRP ED_DPRM9 ; POSITION CURSOR
PAGE
;
; ----- WRITE PARMS FOR DRIVE 0 --------------------------------
;
; ----- GET THE NUMBER OF CYLINDERS
;
MOV DI,ED_D0OFF ; GET POINTER TO DRIVE TABLE
MOV AX,WORD PTR CS:[DI+00] ; GET NUMBER OF CYLS
;
; ----- CONVERT NUMBER OF CYLS TO DECIMAL ASCII & PRINT
;
CALL ED_CVDA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA ; ES:BP POINT TO WORK AREA
MOV DX,0D2DH ; SET ROW/COL
MOV CX,4 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
; ----- GET THE NUMBER OF HEADS
;
MOV AL,BYTE PTR CS:[DI+02] ; GET NUMBER OF HEADS
MOV AH,0 ; ZERO AH
;
; ----- CONVERT NUMBER OF HEADS TO DECIMAL ASCII & PRINT
;
CALL ED_CVDA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA+2 ; ES:BP POINT TO WORK AREA
MOV DX,0E2FH ; SET ROW/COL
MOV CX,2 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
; ----- GET THE WRITE PRE-COMP CYL
;
MOV AX,WORD PTR CS:[DI+05] ; GET PRE-COMP CYLS
;
; ----- CONVERT WRITE PRE-COMP TO HEX ASCII & PRINT
;
CALL ED_CVHA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA ; ES:BP POINT TO WORK AREA
MOV DX,0F2DH ; SET ROW/COL
MOV CX,4 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
; ----- GET THE CONTROL BYTE
;
MOV AX,WORD PTR CS:[DI+08] ; GET CONTROL BYTE
;
; ----- CONVERT CONTROL BYTE TO HEX ASCII & PRINT
;
CALL ED_CVHA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA+2 ; ES:BP POINT TO WORK AREA
MOV DX,102FH ; SET ROW/COL
MOV CX,2 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
; ----- GET THE LANDING ZONE
;
MOV AX,WORD PTR CS:[DI+12] ; GET LANDING ZONE
;
; ----- CONVERT LANDING ZONE TO DECIMAL ASCII & PRINT
;
CALL ED_CVDA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA ; ES:BP POINT TO WORK AREA
MOV DX,112DH ; SET ROW/COL
MOV CX,4 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
; ----- GET SECTORS/TRACK
;
MOV AL,BYTE PTR CS:[DI+14] ; GET SECTORS/TRACK
MOV AH,0 ; CLEAR AH
;
; ----- CONVERT SECTORS/TRACK TO DECIMAL ASCII & PRINT
;
CALL ED_CVDA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA+2 ; ES:BP POINT TO WORK AREA
MOV DX,122FH ; SET ROW/COL
MOV CX,2 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
PAGE
;
; ----- WRITE PARMS FOR DRIVE 1 --------------------------------
;
; ----- GET THE NUMBER OF CYLINDERS
;
MOV DI,ED_D1OFF ; GET POINTER TO DRIVE TABLE
MOV AX,WORD PTR CS:[DI+00] ; GET NUMBER OF CYLS
;
; ----- CONVERT NUMBER OF CYLS TO DECIMAL ASCII & PRINT
;
CALL ED_CVDA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA ; ES:BP POINT TO WORK AREA
MOV DX,0D39H ; SET ROW/COL
MOV CX,4 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
; ----- GET THE NUMBER OF HEADS
;
MOV AL,BYTE PTR CS:[DI+02] ; GET NUMBER OF HEADS
MOV AH,0 ; ZERO AH
;
; ----- CONVERT NUMBER OF HEADS TO DECIMAL ASCII & PRINT
;
CALL ED_CVDA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA+2 ; ES:BP POINT TO WORK AREA
MOV DX,0E3BH ; SET ROW/COL
MOV CX,2 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
; ----- GET THE WRITE PRE-COMP CYL
;
MOV AX,WORD PTR CS:[DI+05] ; GET PRE-COMP CYLS
;
; ----- CONVERT WRITE PRE-COMP TO HEX ASCII & PRINT
;
CALL ED_CVHA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA ; ES:BP POINT TO WORK AREA
MOV DX,0F39H ; SET ROW/COL
MOV CX,4 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
; ----- GET THE CONTROL BYTE
;
MOV AX,WORD PTR CS:[DI+08] ; GET CONTROL BYTE
;
; ----- CONVERT CONTROL BYTE TO HEX ASCII & PRINT
;
CALL ED_CVHA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA+2 ; ES:BP POINT TO WORK AREA
MOV DX,103BH ; SET ROW/COL
MOV CX,2 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
; ----- GET THE LANDING ZONE
;
MOV AX,WORD PTR CS:[DI+12] ; GET LANDING ZONE
;
; ----- CONVERT LANDING ZONE TO DECIMAL ASCII & PRINT
;
CALL ED_CVDA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA ; ES:BP POINT TO WORK AREA
MOV DX,1139H ; SET ROW/COL
MOV CX,4 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
; ----- GET SECTORS/TRACK
;
MOV AL,BYTE PTR CS:[DI+14] ; GET SECTORS/TRACK
MOV AH,0 ; CLEAR AH
;
; ----- CONVERT SECTORS/TRACK TO DECIMAL ASCII & PRINT
;
CALL ED_CVDA ; CONVERT TO ASCII
;
MOV AH,0FH ; REQUEST CURRENT VIDEO MODE
INT 10H ; RUPT TO BIOS
;
LEA BP,ED_WORKA+2 ; ES:BP POINT TO WORK AREA
MOV DX,123BH ; SET ROW/COL
MOV CX,2 ; LENGTH OF STRING
MOV BL,07H ; WRITE ATTRIBUTE
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
;
MOV WORD PTR ED_WORKA+0,0000H ; CLEAR THE
MOV WORD PTR ED_WORKA+2,0000H ; WORK AREA
RET ; RETURN TO CALLER
ED_LDP ENDP
PAGE
ED_CVDA PROC NEAR ; CONVERT BINARY IN AX TO ASCII DEC
PUSH BX ; SAVE BX REG
PUSH DX ; SAVE DX REG
PUSH SI ; SAVE SI REG
MOV WORD PTR ED_WORKA+0,' ' ; CLEAR THE
MOV WORD PTR ED_WORKA+2,' ' ; WORK AREA
LEA BX,ED_WORKA+3 ; GET ADDRESS OF WORK AREA
MOV SI,10 ; GET DIVISOR, BASE 10
ED_CVDAL:
SUB DX,DX ; CLEAR DIVIDEND
DIV SI ; DIVIDE BY 10
ADD DL,'0' ; CONVERT TO ASCII
MOV ES:[BX],DL ; SAVE THE CHARACTER
DEC BX ; BACK UP THROUGH WORK AREA
CMP AX,0 ; DONE ?
JNE ED_CVDAL ; ...NO - LOOP
;
POP SI ; RESTORE SI REG
POP DX ; RESTORE DX REG
POP BX ; RESTORE BX REG
RET ; RETURN TO CALLER
ED_CVDA ENDP
PAGE
ED_HEXTT DB '0123456789ABCDEF'
ED_CVHA PROC NEAR ; CONVERT BINARY IN AX TO ASCII DEC
PUSH BX ; SAVE BX REG
PUSH AX ; SAVE A COPY OF AX
LEA BX,ED_HEXTT ; GET ADDRESS OF XLAT TABLE
AND AL,0FH ; ISOLATE LOW ORDER NIBBLE
XLAT ED_HEXTT ; CONVERT TO ASCII
MOV ED_WORKA+3,AL ; PUT IN OUTPUT AREA
;
POP AX ; GET AX BACK
SHR AL,4 ; ISOLATE HIGH ORDER NIBBLE
XLAT ED_HEXTT ; CONVERT TO ASCII
MOV ED_WORKA+2,AL ; PUT IN OUTPUT AREA
;
MOV AL,AH ; GET HIGH BYTE
AND AL,0FH ; ISOLATE LOW ORDER NIBBLE
XLAT ED_HEXTT ; CONVERT TO ASCII
MOV ED_WORKA+1,AL ; PUT IN OUTPUT AREA
;
MOV AL,AH ; GET HIGH BYTE
SHR AL,4 ; GET HIGH NI
XLAT ED_HEXTT ; CONVERT TO ASCII
MOV ED_WORKA+0,AL ; PUT IN OUTPUT AREA
;
POP BX ; RESTORE AX
RET ; RETURN TO CALLER
ED_CVHA ENDP
ED_INITD PROC NEAR
;
; ----- PROCEDURE TO INITIALIZE HARD DISKS
;
; ----- REGISTER DL HAS THE DRIVE NUMBER (80H=DRIVE 0, 81H=DRIVE 1)
;
; ----- PASS THE DRIVE PARAMETERS TO THE CONTROLLER
;
WCS ED_DIAG2,,CS ; SHOW WHAT TEST ON CRT
MOV AH,09H ; INIT DRIVE CHARACTERISTICS
INT 13H ; RUPT TO BIOS
JNC ED_IN001 ; CONTINUE IF NO ERROR
JMP ED_INITE ; GO TO ERROR ROUTINE IF FAIL
ED_IN001:
PAUSE ; WAIT A SEC
; ----- RESET THE DRIVE
WCS ED_DIAG3,,CS ; SHOW WHAT TEST ON CRT
MOV AH,00H ; RESET
INT 13H ; RUPT TO BIOS
JNC ED_IN002 ; CONTINUE IF NO ERROR
JMP ED_INITE ; GO TO ERROR ROUTINE IF FAIL
ED_IN002:
PAUSE ; WAIT A SEC
; ----- TEST THE DRIVE FOR READY
WCS ED_DIAG4,,CS ; SHOW WHAT TEST ON CRT
MOV AH,10H ; TEST DRIVE READY
INT 13H ; RUPT TO BIOS
JNC ED_IN003 ; CONTINUE IF NO ERROR
JMP ED_INITE ; GO TO ERROR ROUTINE IF FAIL
ED_IN003:
PAUSE ; WAIT A SEC
; ----- RECALIBRATE THE DRIVE
WCS ED_DIAG5,,CS ; SHOW WHAT TEST ON CRT
MOV AH,11H ; RECALIBRATE
INT 13H ; RUPT TO BIOS
JNC ED_IN004 ; CONTINUE IF NO ERROR
JMP ED_INITE ; GO TO ERROR ROUTINE IF FAIL
ED_IN004:
PAUSE ; WAIT A SEC
; ----- TEST THE DRIVE FOR READY
WCS ED_DIAG4,,CS ; SHOW WHAT TEST ON CRT
MOV AH,10H ; TEST DRIVE READY
INT 13H ; RUPT TO BIOS
JNC ED_IN005 ; CONTINUE IF NO ERROR
JMP ED_INITE ; GO TO ERROR ROUTINE IF FAIL
ED_IN005:
PAUSE ; WAIT A SEC
; ----- VERIFY LOW TRACK
WCS ED_DIAG6,,CS ; SHOW WHAT TEST ON CRT
MOV DH,00H ; HEAD 0
MOV CH,00H ; CYL 0
MOV CL,01H ; SECTOR 1
MOV AL,01H ; READ 1 SECTOR
MOV AH,04H ; VERIFY SECTORS
INT 13H ; RUPT TO BIOS
JNC ED_IN006 ; CONTINUE IF NO ERROR
JMP ED_INITE ; GO TO ERROR ROUTINE IF FAIL
ED_IN006:
PAUSE ; WAIT A SEC
; ----- REQUEST THE DRIVE PARMS
WCS ED_DIAG9,,CS ; SHOW WHAT TEST ON CRT
PUSH DX ; SAVE DX REG
MOV AH,08H ; REQUEST DRIVE PARMS
INT 13H ; RUPT TO BIOS
POP AX ; GET OLD DX VALUE
MOV DL,AL ; RESTORE DRIVE NUMBER
JNC ED_IN007 ; CONTINUE IF NO ERROR
JMP ED_INITE ; GO TO ERROR ROUTINE IF FAIL
ED_IN007:
PAUSE ; WAIT A SEC
; ----- VERIFY HIGH TRACK
WCS ED_DIAG7,,CS ; SHOW WHAT TEST ON CRT
AND CL,11000000B ; TURN OFF SECTOR BITS
OR CL,00000001B ; SELECT SECTOR 1
MOV AL,01H ; 1 SECTOR
MOV AH,04H ; VERIFY SECTOR
INT 13H ; RUPT TO BIOS
JNC ED_IN008 ; CONTINUE IF NO ERROR
JMP ED_INITE ; GO TO ERROR ROUTINE IF FAIL
ED_IN008:
PAUSE ; WAIT A SEC
RET ; RETURN TO CALLER
ED_INITE:
CMP DL,80H ; DRIVE 0 ?
JNE ED_HD0IE ; ...NO - DRIVE 1
WCS ED_FD0E2,,CS ; WRITE MESSAGE
JMP ED_HDIRC ; GO SHOW RETURN CODE
ED_HD0IE:
WCS ED_FD1E2,,CS ; WRITE MESSAGE
ED_HDIRC:
CALL ED_CVHA ; CONVERT STATUS TO HEX
;
CMP DL,80H ; DRIVE 0 ?
JNE ED_HDI81 ; ... NO DO DRIVE 1
MOV BH,00H ; VIDEO PAGE 0
LEA BP,ED_WORKA ; ES:BP POINT TO WORK AREA
MOV CX,2 ; LENGTH OF STRING
MOV BL,15 ; WRITE ATTRIBUTE
MOV DX,0640H ; ROW/COL
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
JMP ED_HDIST ; GO SHOW STATUS
ED_HDI81:
MOV BH,00H ; VIDEO PAGE 0
LEA BP,ED_WORKA ; ES:BP POINT TO WORK AREA
MOV CX,2 ; LENGTH OF STRING
MOV BL,15 ; WRITE ATTRIBUTE
MOV DX,0740H ; ROW/COL
MOV AX,1300H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
ED_HDIST:
MOV BH,00H ; VIDEO PAGE 0
LEA BP,ED_WORKA ; ES:BP POINT TO WORK AREA
MOV CX,2 ; LENGTH OF STRING
MOV BL,15 ; WRITE ATTRIBUTE
MOV DX,1636H ; ROW/COL
MOV AX,1301H ; WRITE CHARACTER STRING REQUEST
INT 10H ; RUPT TO BIOS
WCS ED_PRESS,,CS ; WRITE PRESS KEY MSG
MOV BX,4 ; BEEP DURATION
CALL ED_BEEP ; BEEP
MOV AH,00H ; READ KEYBOARD
INT 16H ; RUPT TO BIOS
WCS ED_PRESC,,CS ; WRITE PRESS KEY MSG
CMP DL,80H ; DRIVE 0 FAILED ?? 03/12/88
JNE ED_INXIT ; ...NO -EXIT 03/12/88
;
; ----- SET THE CMOS ERROR BYTE
;
CMOS READ,0EH ; READ DIAG BYTE
;
OR AL,08H ; INDICATE HARD DRIVE FAILED
MOV AH,AL ; SAVE AL'S DATA IN AH
CMOS WRITE,0EH,AH ; WRITE CMOS
;
ED_INXIT: ; 03/12/88
RET ; RETURN TO CALLER
ED_INITD ENDP ; END OF PROC
ED_KINIT PROC NEAR ; PROC TO INITIALIZE KEYBD
;
; ----- SUBROUTINE TO INITIALIZE THE KEYBOARD HANDLER
;
MOV KB_FLAG,00H ; RESET KEYBOARD FLAG
MOV KB_FLAG_1,00H ; RESET KEYBOARD FLAG 1
IN AL,021H ; ENABLE KB RUPTS
AND AL,0FDH ; SET RUPT FLAG
JMP SHORT $+2 ; I/O DELAY
OUT 021H,AL ; FLAG TO PORT
ED_KEXIT: ; RETURN TO CALLER
RET
ED_KINIT ENDP
;
; ----- SUBROUTINE TO BEEP THE SPEAKER
; ----- BX HAS A VALUE FOR DURATION OF THE BEEP
;
ED_BEEP PROC NEAR ; ROUTINE TO BEEP THE SPEAKER
CLI ; RUPTS OFF
MOV AL,0B6H ; SEL TIM 2,LSB,MSB
OUT 043H,AL ; SET TIMER MODE REG
MOV AX,0533H ; DIVISOR FOR 1000HZ
OUT 042H,AL ; TIMER CNT - LSB
MOV AL,AH ; TIMER 2 CNT - MSB
OUT 042H,AL ; SEND THE BYTE
IN AL,061H ; GET CURRENT PORT VALUE
MOV AH,AL ; SAVE IN AH
OR AL,03H ; SPEAKER ON
OUT 061H,AL ; SEND SPKR ON VAL
SUB CX,CX ; ZERO CX REG
ED_BEEP1: ; LOOP TO BEEP
LOOP ED_BEEP1 ; LOOP 'TIL CX 0
DEC BL ; COUNT DONE ??
JNZ ED_BEEP1 ;
MOV AL,AH ; RESTORE SAVED VALUE
OUT 061H,AL ; SEND TO PORT
RET ;
ED_BEEP ENDP ; END OF PROC
EDDT_ROM ENDP ; END OF PROC
ED_CODE ENDS ; CODE SEGMENT END
END